package futbol.tacticas.concursantes.TacticaJuvenil;

import futbol.tacticas.concursantes.Tactica;
import java.awt.*;
import java.util.Vector;
import futbol.*;
import futbol.tacticas.*;

public class TacticaJuvenil implements Tactica{
	  
    private int nValores[][]={
    		{-150,0,7},  // Jugador 1[0]
            {-95,-10,5},  // Jugador 2[1]
            {-95,-65,7},  // Jugador 3[2]
            {-60,10,7},  // Jugador 4[3]
            {-95,65,7},  // Jugador 5[4]
            {30,-35,7},  // Jugador 6[5]
            {10,0,7},  // Jugador 7[6]
            {30,35,7},  // Jugador 8[7]
            {70,-75,7},  // Jugador 9[8]
            {70,75,7},  // Jugador 10[9]
            {90,0,7}  // Jugador 11[10]
    };
    

    Point posicionBola = new Point(0,0);
    
    public Color getColor1() {
        return Color.MAGENTA;
    }

    public Color getColor2() {
        return new Color(30,140,255);
    }

    public Color getColorNumero() {
        return Color.yellow;
    }

    public String getNombre() {
        return "FC Juvenil";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }
    

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
      
        //Coger balon, posiciones mias y del contrario
        Point bola=sj.getBola();
        Point[] posicionJugadores=sj.getMisJugadores();
        Point[] posicionContrarios=sj.getContrario();
   
        
        //Movimiento de jugadores
        int poseedorBalon=equipoTieneBalon(posicionJugadores, bola);
        if (poseedorBalon==-1){
        	int jugadorCercanoABalon=sj.getMasCercanoDeBola();
        	for (int n=1;n<11;n++){
        		if ((n==jugadorCercanoABalon) || (0==jugadorCercanoABalon)){
        			com.add(new ComandoIrA(n,bola.getX(), bola.getY()));
        		}else{
        			com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        		}
        	}
        } else {
        	for (int n=0;n<11;n++){
        		if (n==poseedorBalon){
        			if(n<5){
        				if(n==1){
        					com.add(new ComandoPase(n, sj.getSiguienteJugador(1)));
        				}else{
        					com.add(new ComandoPase(n, 10));
        					for(int i=5;i<11;i++){
        						com.add(new ComandoIrA(n,posicionJugadores[n].getX()-40,posicionJugadores[n].getY()));
        					}
        				}
        			}else{
        				if(posicionJugadores[n].y>0){
        					com.add(new ComandoTiroAPuerta(n, -5));
        				}else{
        					com.add(new ComandoTiroAPuerta(n, 5));
        				}
        			}
        		}else{
        			com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        		}
        	}
        }
        	
        //Defensa sin balón, jugadores 2,3,4,5([1],[2],[3],[4])
        if (bola.x<1){
        	for(int i=1;i<5;i++){
        		int a = sj.getContrarioMasCerca(i);
        		if (!sj.estoyMasCercaDeBola() && i==sj.getMiJugadorMasCerca(posicionContrarios[a].getX(), posicionContrarios[a].getY())){
        			if (bola.getY()>posicionJugadores[i].getY()){
        				com.add(new ComandoIrA(i,posicionContrarios[a].getX()+15, posicionContrarios[a].getY()+10));
        			}else if (bola.getY()<posicionJugadores[i].getY()){
        				com.add(new ComandoIrA(i,posicionContrarios[a].getX()+15, posicionContrarios[a].getY()-10));
        			}else{
        				com.add(new ComandoIrA(i,posicionContrarios[a].getX()+15, posicionContrarios[a].getY()));
        			}
        		}
        	}
        //Defensa y medio campo sin balón (hasta el 8[7])
        } else if (bola.x<75){
        	for(int i=1;i<8;i++){
        		int a = sj.getContrarioMasCerca(i);
        		if (!sj.estoyMasCercaDeBola()){
        			if (bola.getY()>posicionJugadores[i].getY()){
        				com.add(new ComandoIrA(i,posicionContrarios[a].getX()+15, posicionContrarios[a].getY()+10));
        			}else if (bola.getY()<posicionJugadores[i].getY()){
        				com.add(new ComandoIrA(i,posicionContrarios[a].getX()+15, posicionContrarios[a].getY()-10));
        			}else{
        				com.add(new ComandoIrA(i,posicionContrarios[a].getX()+15, posicionContrarios[a].getY()));
        			}
        		}
        	}
        } else {
        	for (int n=0;n<11;n++){
        		com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        	}
        }      
        //Movimiento mas cercano a la bola
        
        if(bola.x<0)
        com.add(new ComandoIrA(1,bola.getX(), bola.getY()));
        int nJug=sj.getMasCercanoDeBola();
        if(nJug==1){
        	com.add(new ComandoIrA(sj.getSiguienteJugador(nJug),bola.getX(), bola.getY()));
        }else{
        	com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        }
        
       
        //BEGIN PORTERO 
        
        if (chequeaAlarmaPortero(sj)){
        	muevePortero(sj,com);
        }else{
        	 muevePorteroSinAlarma(sj,com);
        }
           

        com.add(new ComandoGolpearBola(0,100,0));
        
        //END PORTERO 
        
       
        if (Math.abs(sj.getBola().getX())>=160){
        	posicionBola=new Point(0,0);
        }
        else{
        	posicionBola=sj.getBola();
        }
        
        
        return com;
    }
    
    
    public static boolean jugadorTieneBalon(Point jugador, Point balon){
        return (Math.pow(balon.x - jugador.x, 2) + Math.pow(balon.y - jugador.y, 2)) < 100;
    }
    public static int equipoTieneBalon(Point[] misJugadores, Point balon){
    	for (int i=0; i<11; i++){
    		if((Math.pow(balon.x - misJugadores[i].x, 2) + Math.pow(balon.y - misJugadores[i].y, 2)) < 100){
    			return i;
    		}
    	}
    	return -1;
    }
public  boolean chequeaAlarmaPortero(SituacionJugadores sj){
        
        
        double choque = sj.getBola().getY()+sj.getBola().getY()*
                ((-160-sj.getBola().getX())/sj.getBola().getX() );
        
        boolean a = ((Math.abs( choque ) < 32)&&(sj.getBola().getX()<0));
        
        double d = Math.sqrt(Math.pow((sj.getBola().getX()+160)/(2.5),2)+Math.pow(sj.getBola().getY(),2));
        boolean b = d<70;
        
        return (a && b);
    }
    
    
    public void muevePorteroSinAlarma(SituacionJugadores sj,Vector<Comando> com){
        double signo = sj.getBola().getY()/Math.abs(sj.getBola().getY());
        if (sj.getBola().getY()==0) signo=1;
        double x=dameProyeccionX( sj.getBola().getX() , sj.getBola().getY() , -145 , 50*signo , -160-sj.getBola().getX() , -sj.getBola().getY() );
        double y=dameProyeccionY( sj.getBola().getX() , sj.getBola().getY() , -145 , 50*signo , -160-sj.getBola().getX() , -sj.getBola().getY() );
        com.add(new ComandoIrA(0,(int)x,(int)y)); 
    }
    public double dameProyeccionX(double p1x, double p1y, double p2x, double p2y, double vx, double vy){
        double r;
        if ((vx==0)&&(vy==0)) r=0;
        else r = -(p1x*vx-p2x*vx+p1y*vy-p2y*vy)/(Math.pow(vx,2)+Math.pow(vy,2));
    return (p1x+r*vx);
}
    
    public double dameProyeccionY(double p1x, double p1y, double p2x, double p2y, double vx, double vy){
        double r;
        if ((vx==0)&&(vy==0)) r=0;
        else r = -(p1x*vx-p2x*vx+p1y*vy-p2y*vy)/(Math.pow(vx,2)+Math.pow(vy,2));
    return (p1y+r*vy);  
}
    public void muevePortero(SituacionJugadores sj, Vector<Comando> com){
        
        double p2x = sj.getMisJugadores()[0].getX();
        double p2y = sj.getMisJugadores()[0].getY();
        double p1x = sj.getBola().getX();
        double p1y = sj.getBola().getY();
        double vx = sj.getBola().getX()-posicionBola.getX();
        double vy = sj.getBola().getY()-posicionBola.getY();
        double x = dameProyeccionX(p1x,p1y,p2x,p2y,vx,vy);
        double y = dameProyeccionY(p1x,p1y,p2x,p2y,vx,vy);
        //llegará?
        double v = Math.sqrt(Math.pow(sj.getBola().getX()-posicionBola.getX(),2)+Math.pow(sj.getBola().getY()-posicionBola.getY(),2));
        double r = (v+1)*v/2;
        double t = Math.sqrt(Math.pow(x-p1x,2)+Math.pow(y-p1y,2));
        if (r<t){
        	com.add(new ComandoIrA( 0 , (int)p1x+vx*(r-1)/v , (int)p1y+vy*(r-1)/v )); 
        }
        else{
        	com.add(new ComandoIrA(0,(int)x,(int)y));    
        }
    }
   

}
